package swardToOffer.struct_2_string;

/**
 * @Author ChanZany
 * @Date 2021/5/19 16:58
 * @Version 1.0
 * 字符串对象的创建方式和实例的比较
 */
public class Question1 {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        String s4 = new String("abc");
        String s5 = new StringBuilder("abc").toString();
        String s6 = s3.intern();
        System.out.println(s1==s2); // true，Str="xxx"这种方式创建的字符串公用一个字符串常量内存空间即常量池
        System.out.println(s1==s3); // false,s3通过new在堆中创建了一段新的连续的内存空间
        System.out.println(s3==s4); // false，同上
        System.out.println(s3==s5); // false,同上
        /*true, intern方法返回字符串对象的规范化表示形式，public native String intern();
        * 啥是规范化表示形式，如果s6的内容在字符串常量池中存在，则s6.intern()返回常量池中对象的地址
        * */
        System.out.println(s1==s6);//true
        System.out.println(s3==s6); //false
        System.out.println(s3.intern()==s4.intern());//true
    }
}
